本來要準備來開始JSP的部分了
但翻書才發現還有session的部分
今天就來整理一下Session
範圍為本書的ch6
定義
提供可以針對特定cilent保存多個request的對話機制,將cilent完整的存在記憶體
如何運作
透過SessionID來提供Container辨識
而Container透過Cookie和client交換SessionID
也就是說
Session ID會存在於cookie裡給server和client去做辨識
在程式裡取得Session Cookie的方式為:
//for request
HttpSession session = request.getSession();
//for response
HttpSession session = request.getSession();
由於request.getSession()只是取得的session
但無法提供是否為新建的,因此需要下列這些方法得知
//solve 1
//for request
HttpSession session = request.getSession();
//isNew提供目前取得的session在cilent是否有用過
//若有則會回傳false,若沒有則會回傳true
if(session.isNew())
{
//寫入邏輯
}
//solve 2
//for request
//傳入false變數代表指定回傳預先存在的session
//若之前不存在則session會變成null
HttpSession session = request.getSession(false);
if(session ==null)
{
//代表是新建立的session
session = response.getSession();
}
URL重寫
當遇到cilent把儲存cookie的功能關掉時
需要用到URL重寫的機制來存取sessionID
這裡有介紹到兩個方法(接在response裡使用)
response.encodeURL
response.encodeRedirctURL()
搭配getSession使用的順序為:
當container看見getSession()呼叫,而且沒有從cilent的request取得sessionID
就會知道必須為這個cilent產生新的Session
在這個時間點,Container不清楚Cookie是否能夠,所以在第一次傳送response給cilent時
cookie和URL重寫兩種都會做
Container提供了幾種方式可以操作session將他丟棄:
getCreateionTime()
計算session到目前為止存活的時間
getLastAccessendTime()
找出cilent最後一次存取session的時間
setMaxInactiveInterval()
設定在指定的時間內若沒有收到session的request,就直接銷毀
getMaxInactiveInterval()
取得session可以多久不接受request 或是response
用來判斷session再被結束前還有多少時間
invalidate()
直接將目標session給丟棄的方法
設定session的逾時有三種方式:
1.DD裡面設定
以分鐘為單位,這裡也是設定在全域的範圍內
web.xml
<session-config>
<session-timeout>10</session-timeout>
</session-config>
</web-app>
2.直接在程式裡設定
此做法可以針對特定的session去做處理
這裡則是用秒作為單位,所以要再*60
//設定10分鐘
session.setMaxInactiveInterval(10*60)
3.直接停掉server
也就是直接重啟tomcat,session也會被清除
今天先整理一部分session的內容
明天會再提到cookie和Session遷移的部分